Android — 初始 JNI 和 NDK
前言
最近热修复和插件化炒得火热,是时候头铁开始尝试学习了。那么他们有什么用途吗?
在热修复出现之前,一个已经上线的 APP 如果出现了 Bug,即使是一个非常小的 Bug,不及时更新的话有可能存在风险,若要及时更新就得将 APP 重新打包发布到应用市场,让用户再一次下载,这就大大降低了用户体验,当热修复出现之后,这样的问题就不再是问题了。
对于插件化,如其名,一个程序划分为不同的部分,以插件的形式加载到应用中去,本质上它使用的技术还是热修复技术,只不过是加入了更多的工程实践,让它支持大规模的代码更新以及资源和 so 包的更新。
然而要想更加容易理解热修复和插件化,还是要先学好 JNI 和 NDK 知识的。但是我对 JNI 和 NDK 完全不知呀,不慌不慌,撸会猫,然后一起学习。
什么是 JNI?
全称是 Java native interface,Java 本地开发接口。JNI 是一个协议,这个协议用来沟通 Java 代码和外部的本地代码 ( C/C++ ),通过这个协议,Java 代码可以调用外部的 C/C++ 代码,外部的 C/C++ 代码也可以调用本地的 Java 代码。
什么是 NDK?
全称是 Native Development Kit。NDK 允许用户使用类似 C/C++ 之类的原生代码执行部分程序,NDK 包括了从 C/C++ 生成原生代码库所需的工具和 build files。NDK 是一系列工具的集合,能够帮助开发者快速开发 C/C++ 的动态库,并能自动将 so 和 java 应用一起打包成 apk。
为什么要用 NDK?
- 代码的保护,由于 apk 的 java 层代码很容易被反编译,而 C/C++ 库被反编译的难度较大。
- 在 NDK 中调用第三方 C/C++ 库,因为大部分的开源库都是用 C/C++ 代码编写的。
- 便于移植,用 C/C++ 写的库可以方便在其他的嵌入式平台上再次使用。
- 提升效率,Java 代码是跨平台的,不直接操作硬件。由 Dalvik 虚拟机解释执行,而 IOS 对 objectC 可直接操作硬件,可手动去释放内存,效率比较高。
配置 NDK 开发环境:
Android Studio 目前有两种方式配置 NDK 的开发环境,传统模式和 CMake 方式。传统方式需要配置 Android,mk、Application.mk和gradle,这种方式复杂繁琐。下面介绍 CMake 方式 ( 在 Android Studio 3.0 上实验成功 ):
- 在新建工程时选中 Include C++ support
- 下载 CMake
在执行一的时候,编译器会自动帮你检查是否有 NDK,点击下载就好了,但是最后还是报错:
|
|
它不会给你点击下载,所以 File –> Settings –> ↓
然后运行项目,你就会看到:
Hello from C++